/**
 ******************************************************************************
 * @file           : linux_file_monitor.c
 * @brief          : Linux文件监控示例 - 从文件读取频率数据
 ******************************************************************************
 * @attention
 *
 * 应用场景：实际Linux应用中使用PSV
 * 功能：
 * - 从文本文件读取频率数据（模拟传感器输出）
 * - 使用PSV实时过滤干扰
 * - 输出有效数据到另一个文件
 * - 可用于数据后处理和离线分析
 *
 * 文件格式：
 * input.txt - 每行一个频率值（Hz）
 * output.txt - PSV过滤后的有效频率
 *
 ******************************************************************************
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "../src/psv.h"

/* 配置参数 */
#define INPUT_FILE      "input_freq.txt"    /* 输入文件 */
#define OUTPUT_FILE     "output_freq.txt"   /* 输出文件 */
#define LOG_FILE        "psv_log.txt"       /* 日志文件 */

/* 统计信息 */
typedef struct
{
    uint32_t total_lines;       /* 总行数 */
    uint32_t valid_lines;       /* 有效行数 */
    uint32_t accepted_lines;    /* PSV接受的行数 */
    uint32_t rejected_lines;    /* PSV拒绝的行数 */
} ProcessStats_t;

static ProcessStats_t s_stats = {0};

/**
 * @brief   处理单行频率数据
 * @param   line: 行数据
 * @param   out_fp: 输出文件指针
 * @param   log_fp: 日志文件指针
 * @retval  1=成功，0=失败
 */
static int process_line(const char *line, FILE *out_fp, FILE *log_fp)
{
    uint32_t freq;
    
    /* 解析频率值 */
    if (sscanf(line, "%u", &freq) != 1)
    {
        fprintf(log_fp, "[ERROR] 无法解析行: %s", line);
        return 0;
    }
    
    s_stats.valid_lines++;
    
    /* PSV检测 */
    uint8_t result = psv_check(freq);
    
    if (result)
    {
        /* 接受：写入输出文件 */
        fprintf(out_fp, "%u\n", freq);
        s_stats.accepted_lines++;
        
        /* 记录日志 */
        fprintf(log_fp, "[ACCEPT] 频率 %u Hz 通过检测\n", freq);
    }
    else
    {
        /* 拒绝 */
        s_stats.rejected_lines++;
        
        /* 记录日志 */
        fprintf(log_fp, "[REJECT] 频率 %u Hz 被拒绝（干扰信号）\n", freq);
    }
    
    return 1;
}

/**
 * @brief   打印统计信息
 */
static void print_statistics(void)
{
    printf("\n========================================\n");
    printf("          处理统计报告\n");
    printf("========================================\n\n");
    
    printf("文件处理:\n");
    printf("  - 总行数: %u\n", s_stats.total_lines);
    printf("  - 有效行数: %u\n", s_stats.valid_lines);
    printf("  - 无效行数: %u\n\n", s_stats.total_lines - s_stats.valid_lines);
    
    printf("PSV检测结果:\n");
    printf("  - 接受: %u (%.1f%%)\n", 
           s_stats.accepted_lines,
           s_stats.valid_lines > 0 ? (100.0f * s_stats.accepted_lines / s_stats.valid_lines) : 0);
    printf("  - 拒绝: %u (%.1f%%)\n", 
           s_stats.rejected_lines,
           s_stats.valid_lines > 0 ? (100.0f * s_stats.rejected_lines / s_stats.valid_lines) : 0);
    
    printf("\n输出文件:\n");
    printf("  - 有效数据: %s (%u 行)\n", OUTPUT_FILE, s_stats.accepted_lines);
    printf("  - 日志文件: %s\n", LOG_FILE);
    
    printf("\n========================================\n");
}

/**
 * @brief   生成示例输入文件
 */
static void generate_sample_input(void)
{
    FILE *fp = fopen(INPUT_FILE, "w");
    if (fp == NULL)
    {
        printf("无法创建示例文件\n");
        return;
    }
    
    printf("生成示例输入文件 %s ...\n", INPUT_FILE);
    
    /* 生成100个频率值：70%稳定信号，30%干扰 */
    srand(time(NULL));
    
    for (int i = 0; i < 100; i++)
    {
        uint32_t freq;
        
        if ((rand() % 100) < 70)
        {
            /* 稳定信号：100Hz ± 2% */
            float variation = ((rand() % 40) - 20) / 1000.0f;
            freq = (uint32_t)(100 * (1.0f + variation));
        }
        else
        {
            /* 干扰信号：随机 50~500Hz */
            freq = 50 + (rand() % 450);
        }
        
        fprintf(fp, "%u\n", freq);
    }
    
    fclose(fp);
    printf("✓ 生成完成（100行数据）\n\n");
}

/**
 * @brief   主函数
 */
int main(int argc, char *argv[])
{
    FILE *in_fp = NULL;
    FILE *out_fp = NULL;
    FILE *log_fp = NULL;
    char line[256];
    
    printf("========================================\n");
    printf("  PSV周期信号验证器 - Linux文件处理\n");
    printf("========================================\n\n");
    
    /* 检查输入文件是否存在 */
    in_fp = fopen(INPUT_FILE, "r");
    if (in_fp == NULL)
    {
        printf("输入文件 %s 不存在\n", INPUT_FILE);
        printf("是否生成示例文件? (y/n): ");
        
        char answer[10];
        if (fgets(answer, sizeof(answer), stdin) && answer[0] == 'y')
        {
            generate_sample_input();
            in_fp = fopen(INPUT_FILE, "r");
        }
        else
        {
            printf("退出。\n");
            return 1;
        }
    }
    
    /* 打开输出文件 */
    out_fp = fopen(OUTPUT_FILE, "w");
    if (out_fp == NULL)
    {
        printf("无法创建输出文件 %s\n", OUTPUT_FILE);
        fclose(in_fp);
        return 1;
    }
    
    /* 打开日志文件 */
    log_fp = fopen(LOG_FILE, "w");
    if (log_fp == NULL)
    {
        printf("无法创建日志文件 %s\n", LOG_FILE);
        fclose(in_fp);
        fclose(out_fp);
        return 1;
    }
    
    /* 写入日志头 */
    time_t now = time(NULL);
    fprintf(log_fp, "PSV处理日志\n");
    fprintf(log_fp, "开始时间: %s\n", ctime(&now));
    fprintf(log_fp, "----------------------------------------\n\n");
    
    /* 初始化PSV */
    psv_init();
    fprintf(log_fp, "✓ PSV模块已初始化\n\n");
    
    printf("开始处理文件 %s ...\n", INPUT_FILE);
    printf("----------------------------------------\n");
    
    /* 逐行处理 */
    while (fgets(line, sizeof(line), in_fp) != NULL)
    {
        s_stats.total_lines++;
        
        /* 处理行 */
        process_line(line, out_fp, log_fp);
        
        /* 每10行打印一次进度 */
        if (s_stats.total_lines % 10 == 0)
        {
            printf("已处理: %u 行 (接受:%u 拒绝:%u)\r", 
                   s_stats.total_lines,
                   s_stats.accepted_lines,
                   s_stats.rejected_lines);
            fflush(stdout);
        }
    }
    
    printf("\n----------------------------------------\n");
    printf("处理完成！\n");
    
    /* 获取PSV内部统计 */
    PSV_Statistics_t psv_stats;
    psv_get_statistics(&psv_stats);
    
    fprintf(log_fp, "\n----------------------------------------\n");
    fprintf(log_fp, "PSV内部状态:\n");
    fprintf(log_fp, "  - 变异系数 (CV): %.3f\n", psv_stats.cv);
    fprintf(log_fp, "  - 平均周期: %.1f us\n", psv_stats.mean_period_us);
    fprintf(log_fp, "  - 标准差: %.1f us\n", psv_stats.std_dev_us);
    fprintf(log_fp, "  - 采样数量: %u\n", psv_stats.sample_count);
    fprintf(log_fp, "  - 信号锁定: %s\n", psv_stats.is_locked ? "是" : "否");
    
    /* 打印统计报告 */
    print_statistics();
    
    /* 关闭文件 */
    fclose(in_fp);
    fclose(out_fp);
    fclose(log_fp);
    
    printf("\n提示: 查看 %s 了解详细处理过程\n", LOG_FILE);
    
    return 0;
}

/**
 * 使用说明:
 * 
 * 1. 编译：
 *    gcc linux_file_monitor.c ../src/psv.c -I../src -lm -o psv_monitor
 * 
 * 2. 准备输入文件 input_freq.txt（每行一个频率）：
 *    100
 *    102
 *    98
 *    350
 *    101
 *    ...
 * 
 * 3. 运行：
 *    ./psv_monitor
 * 
 * 4. 查看结果：
 *    - output_freq.txt: PSV过滤后的有效频率
 *    - psv_log.txt: 详细的处理日志
 * 
 * 5. 用途：
 *    - 离线处理传感器采集的数据
 *    - 批量过滤历史数据
 *    - 验证PSV在真实数据上的效果
 */
